/**
 * @file mg_air_conditioner.h
 * @author Charry_Le (530673764@qq.com)
 * @brief 子设备空调头文件
 * @version 0.1
 * @date 2024-02-17
 *
 * @copyright Moorgen Intelligent Technologies Copyright (c) 2024
 *
 */
#ifndef __MG_AIR_CONDITIONER_H__
#define __MG_AIR_CONDITIONER_H__
#include "ite/itp.h"

/*******************************空调默认参数**************************************/
//默认温控器温度上下限
#define  DEV_TEMP_MAX					62		//31.0C
#define  DEV_TEMP_MIN					32		//16.0C
//默认支持风速
#define DEV_SPEED_NORMAL				0x0f	//自动，低，中，高
//默认支持模式
#define DEV_MODE_NORMAL					0x000f	//制冷，除湿，通风，制热
//默认垂直风向
#define DEV_VERTICAL_WIND_NORMAL		0xff	//垂直五档风向全部使能
//默认水平风向
#define DEV_LEVEL_WIND_NORMAL			0xff	//水平五档风向全部使能

// 风速
typedef enum
{
	WIND_SPEED_AUTO = 0,	 // 自动
	WIND_SPEED_LOW = 1,		 // 低	（微风 tiny）
	WIND_SPEED_MID = 2,		 // 中	（轻风 small）
	WIND_SPEED_HIGH = 3,	 // 高	（大风 big）
	WIND_SPEED_MID_HIGH = 4, // 中高	（中风 middle）
	WIND_SPEED_FFAST = 5,	 // 强劲	（强风 huge）
} ENUM_AIR_WIND_SPEED;
// 垂直风向
typedef enum
{
	WIND_DIRECTION_VER_NONE = 0, // 无效
	WIND_DIRECTION_VER_AUTO = 1, // 垂直自动
	WIND_DIRECTION_VER_DOWN = 2, // 垂直向下
	WIND_DIRECTION_VER_UP = 3,	 // 垂直向上
	WIND_DIRECTION_VER_1 = 4,	 // 垂直位置1
	WIND_DIRECTION_VER_2 = 5,	 // 垂直位置2
	WIND_DIRECTION_VER_3 = 6,	 // 垂直位置3
	WIND_DIRECTION_VER_4 = 7,	 // 垂直位置4
	WIND_DIRECTION_VER_5 = 8,	 // 垂直位置5
} ENUM_AIR_WIND_DIRECTION_VER;
// 水平风向
typedef enum
{
	WIND_DIRECTION_LEVEL_NONE = 0,	// 无效
	WIND_DIRECTION_LEVEL_AUTO = 1,	// 水平自动
	WIND_DIRECTION_LEVEL_LEFT = 2,	// 水平向左
	WIND_DIRECTION_LEVEL_RIGHT = 3, // 水平向右
	WIND_DIRECTION_LEVEL_1 = 4,		// 水平位置1
	WIND_DIRECTION_LEVEL_2 = 5,		// 水平位置2
	WIND_DIRECTION_LEVEL_3 = 6,		// 水平位置3
	WIND_DIRECTION_LEVEL_4 = 7,		// 水平位置4
	WIND_DIRECTION_LEVEL_5 = 8,		// 水平位置5
} ENUM_AIR_WIND_DIRECTION_LEVEL;
// 空调模式
typedef enum
{
	MODE_COOL = 1,		 // 制冷
	MODE_WET = 2,		 // 除湿
	MODE_WIND = 3,		 // 通风
	MODE_HEAT = 4,		 // 制热
	MODE_AUTO = 5,		 // 自动
	MODE_DRY = 6,		 // 干燥
	MODE_SLEEP = 7,		 // 睡眠
	MODE_FRESH = 8,		 // 清爽
	MODE_CHANGE = 9,	 // 换气
	MODE_PREHEAT = 10,	 // 预热
	MODE_HEAT_PLUS = 11, // 地暖+制热
	MODE_HEAT_TYPE = 12, // 地暖模式
} ENUM_AIR_MODE;
// 季节模式
typedef enum
{
	SEASON_MODE_OFF = 0,	// 不开启
	SEASON_MODE_SUMMER = 1, // 夏天
	SEASON_MODE_WINTER = 2, // 冬天
} ENUM_SEASON_MODE;

#pragma pack(push) // 开始对齐
#pragma pack(1)	   // 内存以1字节对齐
// 温控器状态
typedef struct
{
	bool Switch;							 // 开关机状态
	ENUM_AIR_MODE Mode;						 //(温控器)模式
	ENUM_AIR_WIND_SPEED WindSpeed;			 //(新风)风速
	ENUM_AIR_WIND_DIRECTION_VER VerWind;	 // 垂直风向
	ENUM_AIR_WIND_DIRECTION_LEVEL LevelWind; // 水平风向
	float UserTemp;							 // 用户设置温度
	bool OccupyState;						 // 占用状态
	ENUM_SEASON_MODE SeasonMode;			 // 季节模式
} STRUCT_AIR_VALU;
// 配置
typedef union
{
	uint8_t ConfigTable[256];
	struct
	{
		uint8_t Save_Flag;				  // 是否储存标志
		uint8_t Key_Mode;				  // 按键模式（0x01默认配置，0x02配置模式）
		uint8_t Key_Func[8];			  // 按键功能定义(按键功能号)
		uint8_t TurnOn_Dispay;			  // 开机界面显示
		uint8_t TurnOff_Dispay;			  // 关机界面显示
		uint8_t TurnOn_Way;				  // 开机方式（0x01短按开机，0x02长按开机）
		uint8_t Light_Compensation_Plus;  // 光感正补偿
		uint8_t Light_Compensation_Minus; // 光感负补偿
		uint8_t Custom_Wind;			  // 自定义风速
		uint16_t Custom_Mode;			  // 自定义模式
		struct
		{
			uint8_t Max : 7;	   // 温度范围最大值
			uint8_t Grads : 1;	   // 温度梯度/精度（0x00:0.5度,0x01:1度）
			uint8_t Min : 7;	   // 温度范围最小值
			uint8_t res : 1;	   // 预留
		} Air_Temp_Range;		   // 空调温度范围
		uint8_t TurnOff_Led_State; // 关机LED亮灭配置
		uint8_t Chinese_Show;	   // 中文显示配置
		struct
		{
			uint8_t Plus : 4;  // 继电器跳变正温差
			uint8_t Minus : 4; // 继电器跳变负温差
		} Relay_Diff;
		uint8_t BackLight_Percent;	 // 背光百分比配置
		uint8_t Custom_Vertical_Dir; // 自定义垂直风向
		uint8_t Custom_Level_Dir;	 // 自定义水平风向
		struct
		{
			uint8_t Max : 7;		   // 温度范围最大值
			uint8_t Grads : 1;		   // 温度梯度/精度（0x00:0.5度,0x01:1度）
			uint8_t Min : 7;		   // 温度范围最小值
			uint8_t res : 1;		   // 预留
		} Heat_Temp_Range;			   // 地暖温度范围
		uint8_t Low_Temp_Protection;   // 低温保护开关(无用)
		uint8_t Vertical_Dir_Mode;	   // 垂直风向模式(无用)
		uint8_t Body_Sensing_Distance; // 人感感应距离
		uint8_t Body_Light_Time;	   // 感应灯光熄灭时间
		uint8_t Hum_Grade_Set;		   // 湿度等级设置(无用)
		uint8_t Seasonal_Pattern;	   // 季节模式
		uint8_t Relay_Mode;			   // 本地继电器控制阀门类型（1:四管制，2:二管制+地暖模式，3:二管制+地暖通道，4三线阀）
		struct
		{
			uint8_t Mode_Cool_En : 1;	  // 制冷模式禁使能
			uint8_t Mode_Heat_En : 1;	  // 制热模式禁使能
			uint8_t Mode_Preheat_En : 1;  // 预热模式禁使能
			uint8_t Mode_HeatPlus_En : 1; // 地暖加制热模式禁使能
			uint8_t Mode_HeatType_En : 1; // 地暖模式禁使能
			uint8_t res : 2;
			uint8_t Immobilization : 1;	  // 固定位（固定为0）
		} Mode_function;				  // 模式禁使能
		uint8_t BackLight_DimmingOnTime;  // 背光点亮时间(100ms)
		uint8_t BackLight_DimmingOffTime; // 背光熄灭时间(100ms)
		uint8_t Air_Error_Code;			  // 空调错误码(无用)
		uint8_t CurTemp_Source;			  // 室内温度来源
		uint8_t res0[4];					// 背光
		uint8_t res[84];				  // 注意128字节对齐
		uint8_t Seasonal_Switch;		  // 季节模式开关//地址0x80
		struct
		{
			uint8_t Mouth;	 // 月
			uint8_t Day;	 // 日
		} Summer_Start_Date; // 夏季开始日期
		struct
		{
			uint8_t Mouth; // 月
			uint8_t Day;   // 日
		} Summer_End_Date; // 夏季结束日期
		struct
		{
			uint8_t Mouth;	 // 月
			uint8_t Day;	 // 日
		} Winter_Start_Date; // 冬季开始日期
		struct
		{
			uint8_t Mouth; // 月
			uint8_t Day;   // 日
		} Winter_End_Date; // 冬季结束日期
		struct
		{
			uint8_t Max;		 // 月
			uint8_t Min;		 // 日
		} Summer_Air_Temp_Range; // 夏季空调温度范围
		struct
		{
			uint8_t Max;		 // 月
			uint8_t Min;		 // 日
		} Winter_Air_Temp_Range; // 冬季空调温度范围
	} byte;
} AIR_CONFIG;
#pragma pack(pop) // 结束对齐

extern STRUCT_AIR_VALU Air;
extern STRUCT_AIR_VALU Air_After_Occupy; // 占用后温控器参数
extern AIR_CONFIG Air_Config;

// 获取温控器温度最小值
float Get_Air_TempRange_Min(void);
// 获取温控器温度最大值
float Get_Air_TempRange_Max(void);
// 模式是否支持
uint8_t Mode_Is_Support(ENUM_AIR_MODE Mode);
// 模式是否使能
uint8_t Mode_Is_Enable(ENUM_AIR_MODE Mode);
// 风速是否支持
uint8_t Fan_Is_Support(ENUM_AIR_WIND_SPEED Speed);
// 垂直风向是否支持
uint8_t Vertical_Dir_Support(ENUM_AIR_WIND_DIRECTION_VER Direction);
// 水平风向是否支持
uint8_t Level_Dir_Is_Support(ENUM_AIR_WIND_DIRECTION_LEVEL Direction);

// 空调开关控制
void Air_Switch_Set(bool Switch);
// 空调温度控制
void Air_Temp_Set(float Temperature);
// 空调温度加
void Air_Temp_Add(void);
// 空调温度减
void Air_Temp_Sub(void);
// 空调模式控制
void Air_Mode_Set(ENUM_AIR_MODE Mode);
// 空调模式切换(按键触发)
void Air_Mode_Cut(void);
// 空调风速控制
void Air_Fan_Set(ENUM_AIR_WIND_SPEED Speed);
// 空调风速+
void Air_Fan_Add(void);
// 空调风速-
void Air_Fan_Sub(void);
// 空调垂直风向控制
void Air_Vertical_FanDirection_Set(ENUM_AIR_WIND_DIRECTION_VER Direction);
// 空调水平风向控制
void Air_Level_FanDirection_Set(ENUM_AIR_WIND_DIRECTION_LEVEL Direction);
// 设置空调模式禁使能
void Set_Air_Mode_Enable(ENUM_AIR_MODE Mode, bool Enable);
// 设置季节模式
void Set_Air_Season_Mode(ENUM_SEASON_MODE mode);
#endif